System Design_大型网站安全架构

网站应用攻击与防御

XSS攻击

XSS攻击即夸站点脚本攻击(Cross Site Script),指黑客通过篡改网页,注入恶意HTML脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。

常见的XSS攻击类型有两种,一种是反射型,攻击者诱使用户点击一个嵌入恶意脚本的链接,达到攻击的目的。

System_design_c8_1

另一种XSS攻击是持久型XSS攻击,黑客提交含有恶意脚本的请求,保存在被攻击的Web站点的数据库中,用户浏览网页时,恶意脚本被包含在正常页面中,达到攻击的目的。

System_design_c8_2

XSS防攻击的主要方式有如下两种:

消毒

XSS攻击者一般都是通过在请求中嵌入恶意脚本达到攻击目的,这些脚本是一般用户输入中不使用的,如果进行过滤和消毒处理,即对某些html危险字符转义,如”>”转义为”&gt”等,就可以防止大部分攻击。为了避免对不必要的内容转移错误,如”3<5”中的”<”需要进行文本匹配后再转义,如”<img src=”这样的上下文中的”<”才转义。消毒几乎是所有网站最必备的XSS防攻击手段。

HttpOnly

浏览器禁止页面JavaScript访问带有HttpOnly属性的Cookie。HttpOnly并不是直接对抗XSS攻击的,而是防止XSS攻击窃取Cookie。对于存放敏感信息的Cookie,如用户认证信息等,可通过对该Cookie添加HttpOnly属性,避免被攻击脚本窃取。

注入攻击

注入攻击主要有两种形式,SQL注入攻击和OS注入攻击。SQL注入攻击为攻击者在HTTP请求中注入恶意SQL命令(drop table users),服务器用请求构造参数构造数据库SQL命令时,恶意SQL被一起构造,并在数据库执行。

System_design_c8_3

SQL注入攻击需要攻击者对数据库结构有所了解才能进行,攻击者获取数据库表结构信息的手段有如下几种:

网站基于开源软件搭建
错误回显:如果网站开启错误回显,即服务器内部500错误会显示到浏览器上。
盲注:网站关闭错误回显,攻击者根据页面变化情况判断SQL语句的执行情况,据此猜测数据库表结构,难度比较大。

防御SQL注入攻击首先要避免被攻击者猜测到表名等数据库表结构信息,此外还可以采用如下方式:

消毒:和防XSS攻击一样,请求参数消毒是一种比较简单粗暴又有效的手段。通过正则匹配,过滤请求数据中可能注入的SQL,如”drop table”等。

参数绑定:使用预编译手段,绑定参数是最好的防SQL注入方法。目前许多数据访问层框架,如IBatis,Hibernate等,都实现SQL预编译和参数绑定,攻击者的恶意SQL会被当做SQL的参数,而不是SQL命令被执行。

除了SQL注入,攻击者还根据具体应用,注入OS命令、编程语言代码等,利用程序漏洞,达到攻击目的。

CSRF攻击

CSRF(Cross Site Request Forgery,跨站点请求伪造),攻击者通过跨站请求,以合法用户的身份进行非法操作,如转账交易等。CSRF的主要手法是利用跨站请求,在用户不知情的情况下,以用户的身份伪造请求。其核心是利用了浏览器Cookie或服务器Session策略,盗取用户身份。

System_design_c8_4

CSRF的防御手段主要是识别请求者身份。主要有下面几种方法:

表单Token

CSRF是一个伪造用户请求的操作,所以需要构造用户的请求的所有参数才可以。表单Token通过在请求参数中增加随机数的方法来阻止攻击获得所有请求参数:在页面表单中增加一个随机数作为Token,每次响应页面的Token都不相同,从正常页面提交的请求会包含该Token值,而伪造的请求无法获得该值,服务器检查请求参数中Token的值是否存在并且正确以确定请求提交者是否为伪造的。

验证码

验证码是一种更加简单有效的手段,即请求提交时,需要通过用户输入验证码。

Referer check

HTTP请求头的Referer域中记录着请求来源,可通过检查请求来源,验证其是否合法。

其他攻击和漏洞

Error Code
错误回显信息。可以通过配置Web服务器参数,跳转到500页面(HTTP响应码500表示服务器内部错误)到专门的错误页面即可,Web应用常用的MVC框架也有这个功能。

HTML注释:HTML注释会显示在客户端浏览器。

文件上传上传可执行程序以及攻击者获得服务器端命令执行能力。有效的手段是设置上传文件白名单,只允许上传可靠的文件类型。此外还可以修改文件名,使用专门的存储等手段。

路径遍历:攻击者在请求的URL中使用相对路径,遍历系统为开放的目录和文件。防御主要是将JS,CSS等资源文件部署在独立服务器,使用独立域名,其他文件不使用静态URL访问,动态参数最好不包含文件路径信息。

Web应用防火墙

ModSecurity是一个开源的Web应用防火墙,自动探测攻击并保护Web程序,能够同一拦截请求,过滤恶意参数,自动消毒,添加Token等。既可以嵌入到Web应用服务器中,也可以作为一个独立的应用程序启动。

ModSecurity采用处理逻辑与攻击规则集合分离的架构模式。处理逻辑(执行引擎)负责请求和响应的拦截过滤,规则加载执行等功能。而攻击规则集合则负责描述对具体攻击的规则定义、模式识别、防御策略等功能(可以通过文本方式进行描述)。处理逻辑比较稳定,规则集合需要不断针对漏洞进行升级,这时一种可扩展的架构设计。

System_design_c8_5

网站安全漏洞扫描

网络安全漏洞扫描工具是根据内置规则,构造具有攻击性的URL请求,模拟黑客攻击行为,用以发现网站安全漏洞的工具。

信息加密技术及密钥安全管理

网站用户账户密码等敏感信息不能以明文存储,必须要进行加密处理。信息加密技术可分为三类:单项散列加密,对称加密和非对称加密。

单向散列加密

单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,即不能对固定长度的输出进行逆计算得到输入信息。

System_design_c8_6

利用单向散列加密的特性,可以进行密码加密保存,即用户注册时的密码不直接保存到数据库,而是进行单向散列加密后将密文存入数据库。用户登录时,进行密码验证,同样计算得到输入密码的密文,并和数据库的密文比较。

System_design_c8_7

这样即使数据库被”拖库”,也不会泄露用户的密码信息。

虽然不能通过算法将单向散列密文反算得到明文,但是由于人们设置密码具有一定模式,因此通过彩虹表(人们常用密码和对应的密文关系表等)等手段可以进行猜测式破解。

为了加强单向散列计算的安全性,还会给散列算法加点盐(salt),salt相当于加密的密钥,增加了破解的难度。

常用的单向散列算法有MD5,SHA等。单向散列算法还有一个特点就是输入的任何微小变化都会导致输出的完全不同,这个特性有时也会被用来生成信息摘要、计算具有高离散程度的随机数等用途。

对称加密

所谓对称加密是指加密和解密使用的密钥是同一个密钥(或者可以互相推算)。

System_design_c8_8

对称加密通常用在信息需要安全交换或存储的场合,如Cookie加密、通信加密等。

对称加密的优点是算法简单,加密解密效率高,适合对大量数据加密。缺点是加密解密使用同一个密钥,远程通信的情况下如何安全的交换密钥是个难题,如果密钥丢失,那么所有的加密信息也就失去安全性。

常用的对称加密算法有DES,RC算法等。对称加密是一种传统加密手段,也是最常用的加密手段,适用于绝大多数需要加密的场合。

非对称加密

不同于对称加密,非对称加密和解密使用的密钥不是同一密钥,其中一个对外公开,被称为公钥,另一个只有所有者直到,称为私钥。使用公钥加密的信息必须要私钥才能解开,反之,用私钥加密的信息只有用公钥才能解开。理论上不可能通过公钥计算获得私钥。

System_design_c8_9

非对称加密技术通常用在信息安全传输、数字签名等场合。

信息发送者A通过公开渠道获得信息接收者B的公钥,对提交信息进行加密,然后发送到B,B得到密文信息后使用私钥解密获得明文信息。即使信息在中途被窃取,没有B的私钥也无法还原明文。

数字签名的过程则相反,签名者用自己的私钥对信息加密,然后发送给对方,接收方用签名者的公钥对信息进行解密,获得明文信息。由于私钥只有签名者拥有,因此该信息必然是由签名者发送的,不可抵赖,具有签名性质。

在实际应用中,常常会混合使用对称加密和非对称加密。先使用非对称加密技术对对称密钥进行传输,然后使用对称加密技术进行信息加密解密与交换。另外可以对同一个数据两次使用非对称加密,可同时实现信息的安全传输和数字签名的目的。

非对称加密的常用算法有RSA算法等。HTTPS传输中浏览器使用的数字证书实质上是经过权威机构认证的非对称加密的公钥。

密钥安全管理

上面的加密算法能否达到安全保密关键的一点是密钥的安全。信息的安全是靠密钥保证的。

改善密钥安全性的手段有两种:

一种是包密钥和算法放在一个独立的服务器上,甚至做出一个专用的硬件设施,对胃提供加密和解密服务,应用系统通过调用这个服务,实现数据的加密解密。优点是安全性高,但是成本较高,系统开销大,甚至可能称为应用瓶颈。

另一种方案是将加密解密算法放在应用系统中,密钥则放在独立服务器中,为了提高密钥的安全性,实际存储时,密钥被切分为数片,加密后分别保存在不同的存储介质中,兼顾密钥安全性有改善了性能。

System_design_c8_10

应用程序调用密钥安全管理系统提供的加密解密服务接口对信息进行加密解密,该接口实现了常用的加密解密算法并根据需求任意扩展。加密解密服务接口则通过密钥服务器的密钥服务取得加密解密密钥,并缓存在本地(定时更新)。而密钥服务器中的密钥则来自多个密钥存储服务器,一个密钥分片后存储在多个服务器中,每个服务器都有专人负责管理。密钥申请者、管理者、安全审核人员通过密钥管理控制台管理更新密钥,没有人能够查看完整的密钥信息。

信息过滤与反垃圾

常用的信息过滤与反垃圾手段有以下几种。

文本匹配

文本匹配主要解决敏感词过滤的问题,进行消毒处理或者拒绝发表。

如果敏感词较少,可以直接使用正则表达式匹配,但是效率较差,不使用高并发量时以及大数据量时。更好的选择是基于Trie树,或则Trie树的变种,如双数组Trie算法,利用两个稀疏数组存储树结构,base数组存储Trie树的节点,check数组进行状态检查。

另一种更简单的实现是通过构造多级Hash表进行文本匹配。过滤树的分支可能比较多,为了提高匹配速度,减少不必要的查找,同一层中相同父节点的字可放在Hash表中。

System_design_c8_11

有时还需要对信息进行降噪预处理,如”笨_%单”。

分类算法

用于自动识别广告信息、垃圾邮件等。

System_design_c8_12

比较简单实用的有贝叶斯分类算法,贝叶斯算法认为特征值之间是独立的,所以也成为朴素贝叶斯算法,然而这个假设很多时候是不成立的,特征值之间具有关联性。通过对贝叶斯算法增加特征值的关联依赖处理,得到TAN算法。更进一步,通过对关联规则的聚类挖掘,可以到ARCS(Association Rule Clustering System)等更强大的算法。由于朴素贝叶斯的简单高效,所以其仍然是很多在线系统的首选。

分类算法除了用于反垃圾,也用于信息自动分类等。

黑名单

黑名单可以通过Hash表实现,简单高效,但是内存消耗较大。在黑名单列表非常大时,如果能够容忍小概率的差错,可以使用布隆过滤器代替Hash表(Bloom filter)。Bloom filter是一种常用的处理海量数据的技术。

System_design_c8_13